﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CHILIS.Componentes.CoreRestaurant.Logic.Facade;
using CHILIS.Componentes.CoreRestaurant.Model.Adquicisiones;

namespace CHILIS.Componentes.BLCoreRestaurant.Class
{
    public static class BLInsumo
    {

        public static List<AD_Insumo> ListarInsumos(int codigoInsumo)
        {
            return Insumo.ListarInsumos(codigoInsumo);
        }

        public static List<AD_SolicitudInsumo> ListadoSolicitudInsumo(string tipoSol, string desc, DateTime? fecSol)
        {
            return Insumo.ListadoSolicitudInsumo(tipoSol, desc, fecSol);
        }

        public static AD_SolicitudInsumo ObtenerSolicitudInsumo(int? numeroSolicitud)
        {
            return Insumo.ObtenerSolicitudInsumo(numeroSolicitud);
        }

        public static Dictionary<int, int> ObtenerDetalleSolicitudInsumo(int? numeroSolicitud)
        {
            return ObtenerSolicitudInsumo(numeroSolicitud).ListaDetalles.Select(x => new { x.Codigo_Insumo, x.Cantidad })
                                                      .ToDictionary(k => Convert.ToInt32(k.Codigo_Insumo), k => Convert.ToInt32(k.Cantidad));
        }

        public static List<AD_DetalleSolicitudInsumo> ObtenerDetalleSolicitudInsumoxProveedor(int? codigoProveedor)
        {
            return Insumo.ObtenerDetalleSolicitudInsumoxProveedor(codigoProveedor);
        }

        public static bool EliminarSolicitudInsumo(int numeroSolicitud)
        {
            return Insumo.EliminarSolicitudInsumo(numeroSolicitud);
        }

        public static bool RegistrarSolicitudInsumo(int Numero_Solicitud, string Tipo_Solicitud,
                                                    DateTime Fecha_Solicitud,
                                                    DateTime Fecha_Entrega, string Descripcion,
                                                    Dictionary<int, int> DetalleInsumos)
        {
            return Insumo.RegistrarSolicitudInsumo(Numero_Solicitud, Tipo_Solicitud, Fecha_Solicitud, Fecha_Entrega, Descripcion, DetalleInsumos);
        }

        public static bool EsValidoStock(int idInsumo, int cantidad)
        {
            bool exito = true;
            //Se obtiene el stock del insumo
            var stock = Insumo.ObtenerInsumoStock(idInsumo);
            if (stock == null)
            {
                return false;
            }
            decimal? stockActual = stock.FirstOrDefault().Stock_Actual;
            decimal? stockMaximo = stock.FirstOrDefault().Stock_Maximo;

            if ((stockActual + cantidad) > stockMaximo)
            {
                exito = false;
            }

            return exito;
        }

        public static bool EsVentaProyectada(int idInsumo, int cantidadInsumo)
        {
            bool exito = true;
            var proyeccion = Insumo.ObtenerVentaProyectada(idInsumo, cantidadInsumo, DateTime.Now);

            if (proyeccion.Count == 0)
            {
                exito = false;
            }

            return exito;
        }

        public static List<AD_ListadoGeneralSolicitudInsumo> ListadoOrdenCompra(int? codigoProveedor)
        {
            return Insumo.ListadoOrdenCompra(codigoProveedor);
        }

        public static int GenerarOrdenCompra(int? codigoProveedor)
        {
            bool exito = true;
            //Se debe obtener las solicitudes pendientes con este proveedor
            var detalleSol = Insumo.ObtenerSolicitudInsumoProveedor(codigoProveedor);
            decimal subTotal = detalleSol.Sum(x => x.Cantidad * x.Precio_Insumo);
            decimal igv = (subTotal * Convert.ToDecimal(0.19));
            AD_OrdenCompra ordenCompra = new AD_OrdenCompra();
            ordenCompra.Fecha_Entrega = DateTime.Now;
            ordenCompra.Fecha_Generacion = DateTime.Now;
            ordenCompra.subTotal = subTotal;
            ordenCompra.igv = igv;
            ordenCompra.total = subTotal + igv;
            ordenCompra.Estado_OC = '1';
            ordenCompra.Fecha_Creacion = DateTime.Now;
            ordenCompra.moneda = "PEN";
            ordenCompra.Estado_Registro = 1;

            List<AD_DetalleOrdenCompra> detalleOrden = new List<AD_DetalleOrdenCompra>();
            AD_DetalleOrdenCompra iterador;

            foreach (var codIns in detalleSol.Select(x => x.Codigo_Insumo).Distinct())
            {
                iterador = new AD_DetalleOrdenCompra();
                //iterador.Codigo_Insumo = precioCantidad.Codigo_Insumo;
                //iterador.Cantidad = precioCantidad.Cantidad;
                //iterador.Precio = precioCantidad.Precio_Insumo;
                iterador.Codigo_Insumo = codIns;
                iterador.Cantidad = detalleSol.Where(p => p.Codigo_Insumo == codIns).Sum(x => x.Cantidad);
                iterador.Precio = detalleSol.Where(x => x.Codigo_Insumo == codIns).Select(p => p.Precio_Insumo).FirstOrDefault();
                iterador.Estado_Detalle_OC = 1;
                iterador.Fecha_Creacion = DateTime.Now;
                iterador.Estado_Registro = 1;
                detalleOrden.Add(iterador);
            }

            //ordenCompra.DetalleOrden.Add();
            int nroOC = Insumo.GenerarOrdenCompra(ordenCompra, detalleOrden);

            if (nroOC == -1)
            {
                exito = false;
            }
            else
            {
                //Se debe actualizar los detalle de insumo de solicitudes con la orden de compra generada
                //Se obtiene los ID's de detalle de solicitudes
                //List<int> listaNrosSol = detalleSol.Select(x => x.Numero_Solicitud).ToList();
                Insumo.AsignarOrdenCompraSolicituInsumo(detalleSol, nroOC);
            }

            return nroOC;
        }


        public static AD_OrdenCompra ObtenerOrdenCompraMax()
        {
            return Insumo.ObtenerOrdenCompraMax();
        }

        public static AD_Proveedor ObtenerProveedorPorOrdenCompra(int nroOC)
        {
            return Insumo.ObtenerProveedorPorOrdenCompra(nroOC);
        }

        public static bool AnulacionOrdenCompra(int nroOC, string motivo)
        {
            return Insumo.AnulacionOrdenCompra(nroOC, motivo);
        }

        public static List<AD_DetalleOrdenCompra> ObtenerDetalleOrdenCompra(int nroOC)
        {
            return Insumo.ObtenerDetalleOrdenCompra(nroOC);
        }

        public static AD_Proveedor ObtenerProveedor(int codigoProveedor)
        {
            return Insumo.ObtenerProveedor(codigoProveedor);
        }


    }
}
